package cn.wolfcode.web.interceptor;

import cn.wolfcode.domain.Employee;
import cn.wolfcode.domain.Permission;
import cn.wolfcode.qo.JsonResult;
import cn.wolfcode.util.RequiredPermission;
import cn.wolfcode.util.UserContext;
import com.alibaba.fastjson.JSON;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;

public class CheckPermissionInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        if (handler instanceof HandlerMethod){  //先判断是动态请求，若不是动态请求则放行
            //获取当前用户登录信息
            Employee currentUser = UserContext.getCurrentUser();
            //判断是否是超级管理员
            if(currentUser.isAdmin()){
                return true; //放行
            }
            //不是炒鸡管理员
            //HandlerMethod 是 Spring MVC 会使用这个类的对象进项目所有控制器处理方法进行封装
            //由于handler的类型式Object，所以要进行强转
            HandlerMethod method = (HandlerMethod)handler;
            //获取当前请求方法上的注解
            RequiredPermission methodAnnotation = method.getMethodAnnotation(RequiredPermission.class);
            //去判断处理方法上是否贴了自定义注解
            if(methodAnnotation==null){
                //方法上没有贴注解，不需要权限控制，直接放行
                return true;
            }
            //代码执行到这里 访问的处理方法贴了自定义注解，需要权限控制器
            //获取注解上的权限表达式，和此员工所有具有权限表达式对比，若包含放行访问
            String expression = methodAnnotation.expression();

            //Todo 登录的时候去数据库根据用户id查询寻该用户拥有的权限集合，放入到session中。
            List<Permission> permissionList= UserContext.getCurrentPermissions();
            //遍历用户的权限集合，判断当前方法的权限是否在用户权限集合中
            for (Permission p : permissionList) {
                if(p.getExpression().equals(expression)){
                    //说明用户拥有这个权限，直接放行
                    return true;
                }
            }

            //循环完都没有找到，说明用户的权限集合中并没有当前访问方法的权限，没有权限则进行拦截。
            //针对不同情况进行处理，根据当前访问方法是否有贴@ResponseBody注解判断是哪种请求
            ResponseBody methodAnnotation1 = method.getMethodAnnotation(ResponseBody.class);
            if(methodAnnotation1==null){
                //1.页面请求（转发）   重定向：浏览期再发一次请求  转发：在当前页跳转
                //request.getRequestDispatcher("WEB-INF/views/common/nopermission.ftl").forward(request,response);

                response.sendRedirect("/nopermission");

            }else{
                //2.JSON数据的请求
                response.setContentType("application/json;charset=utf-8");  //处理乱码问题
                String responseData = JSON.toJSONString(new JsonResult(false, "您没有权限操作"));
                response.getWriter().write(responseData);
            }
            return false;
        }
        return true;
    }
}
